public class Oj {
    /*
    结点内部类
     */
    static class ListNode{
        public int val;
        public ListNode next;

        public ListNode(int val) {
            this.val = val;
        }
    }

    public Oj.ListNode head; //不初始化，默认就是null

    //创建一个单链表
    public void createList(){
        Oj.ListNode listNode1 = new Oj.ListNode(1);
        Oj.ListNode listNode2 = new Oj.ListNode(2);
        Oj.ListNode listNode3 = new Oj.ListNode(3);
        Oj.ListNode listNode4 = new Oj.ListNode(4);
        Oj.ListNode listNode5 = new Oj.ListNode(5);
        listNode1.next = listNode2;
        listNode2.next = listNode3;
        listNode3.next = listNode4;
        listNode4.next = listNode5;
        this.head = listNode1; //设置一个头节点
    }

    //打印单链表数据，默认从头开始打印
    public void display(){
        Oj.ListNode cur = this.head;
        while (cur != null){
            System.out.print(cur.val+" ");
            cur = cur.next;
        }
        System.out.println();
    }

    /**
     * 印单链表数据,从指定节点开始
     * @param newNode 指定节点
     */
    public void display(ListNode newNode){
        Oj.ListNode cur = newNode;
        while (cur != null){
            System.out.print(cur.val+" ");
            cur = cur.next;
        }
        System.out.println();
    }

    // 1 -- BM1 反转链表
//    给定一个单链表的头结点pHead(该头节点是有值的，比如在下图，它的val是1)，长度为n，反转该链表后，返回新链表的表头。
    public ListNode ReverseList() {
        //无节点
        if(head == null){
            return null;
        }
        //有1个节点
        if(head.next == null){
            return head;
        }
        //多个节点
        ListNode cur = head.next;
        head.next = null;
        while (cur != null){
            ListNode curNext = cur.next;
            cur.next = head;
            head = cur;
            cur = curNext;
        }
        return head;
    }

    public static void main(String[] args) {
        Oj list = new Oj();
        list.createList();
        list.display();

        ListNode ret = list.ReverseList();
        list.display(ret);
    }
}
